iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0
Modern Web

Rust 新手村系列 第 23

Rust-定義Closure(閉包)

  • 分享至 

  • xImage
  •  

一般來說Rust如果要排序數組會這樣寫

let mut arr = [10, 5, 9, 7, 6]

arr.sort();

println!("{:?}", arr);

輸出
[5, 6, 7, 9, 10]

剛剛升序如果要降序就必須使用sort_by 需要自己寫函式來傳給sort_by排序決定用

let mut arr = [10, 5, 9, 7, 6]

use std::cmp::Ordering;

fn descFn(a: &i32, b: &i32) -> Ordering {
    if  a < b {
        return Ordering::Greater;
    } else if a > b  {
        return Ordering::Less
    } else {
        return Ordering::Equal
    }
}

arr.sort_by(descFn);

println!("{:?}", arr);

輸出
[10, 9, 7, 6, 5]

造上面這樣使用有個缺點就是必須在宣告一個函式,如果只用一次的話就可用更簡短的使用匿名函式

let mut arr = [10, 5, 9, 7, 6]

use std::cmp::Ordering;

arr.sort_by(|a: &i32, b: &i32|
    if  a < b {
        return Ordering::Greater;
    } else if a > b  {
        return Ordering::Less
    } else {
        return Ordering::Equal
    }
);

println!("{:?}", arr);
輸出
[10, 9, 7, 6, 5]

使用一個匿名函式就可以簡短許多不用再宣告新的函式

Rust跟一般語言的匿名函式有個特別的限制就是無法使用外部宣告的變數

例如這樣是不合法的

let outVal = 10;

fn printOutVal() {
    println!("{}", outVal); // 無法訪問outVal變數
}

printOutVal();

// 編譯時會出現錯誤

但是使用靜態變數或是常量例如

const CONSTVAL: i32 = 10;

fn printOutVal() {
    println!("{}", CONSTVAL); // 合法使用
}

printOutVal();

-----------------------------

static STATICVAL: i32 = 0;

fn printOutVal() {
    println!("{}", CONSTVAL); // 合法使用
}

printOutVal();

Rust這樣限制應該基於所有權的設計關係,這樣有個好處就是避免亂引用變數造成BUG也比較好閱讀

當然Closure有更多複雜的使用這邊只簡單介紹最基本的使用方法


上一篇
Rust-所有權(二)
下一篇
Rust-命令行的輸入輸出
系列文
Rust 新手村30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言